package config

import (
	"time"

	"gitee.com/gousing/values"
)

// GetTime 读取并转换目标为time.Time
//   - 如待转换目标是字符串(日期时间)未包含时区信息时，则使用 Server/Local 时区区
func GetTime(key string) time.Time {
	return GetTimeD(key, time.Time{})
}

// GetTimeD 读取并转换目标为time.Time, 转换失败则返回defaultVal指定的Time对象
//   - 如待转换目标是数值(当做Unix秒级时间戳), 则使用 Server/Local 时区
//   - 如待转换目标是字符串(日期时间)未包含时区信息时, 则使用 Server/Local 时区
func GetTimeD(key string, defaultVal time.Time) time.Time {
	if v, ok := GetExist(key); !ok {
		return defaultVal
	} else {
		if to, err := values.ToTimeE(v); err != nil {
			return defaultVal
		} else {
			return to
		}
	}
}

// GetTimeE  读取并转换目标为time.Time, 转换失败则返回空Time对象和错误信息
//   - 如待转换目标是数值(当做Unix秒级时间戳), 则使用 Server/Local 时区
//   - 如待转换目标是字符串(日期时间)未包含时区信息时, 则使用 Server/Local 时区
func GetTimeE(key string) (time.Time, error) {
	if v, ok := GetExist(key); !ok {
		return time.Time{}, ErrKeyNotExist
	} else {
		return values.ToTimeE(v)
	}
}

// GetTimeWith 读取并转换目标为指定的时区的time.Time(指定时区), 转换失败则返回空Time对象和错误信息
//   - 如待转换目标是数值(当做Unix秒级时间戳), 则使用 location 指定的时区
//   - 如待转换目标是字符串(日期时间)未包含时区信息时, 则使用 location 指定的时区
func GetTimeWith(key string, location *time.Location) (time.Time, error) {
	if v, ok := GetExist(key); !ok {
		return time.Time{}, ErrKeyNotExist
	} else {
		return values.ToTimeWith(v, location)
	}
}

// GetTimeDuration  读取并转换目标为time.Duration, 转换失败则返回零值的Duration
func GetTimeDuration(key string) time.Duration {
	return GetTimeDurationD(key, 0)
}

// GetTimeDurationD 读取并转换目标为time.Duration, 转换失败则返回defaultVal指定的Duration对象
func GetTimeDurationD(key string, defaultVal time.Duration) time.Duration {
	if v, ok := GetExist(key); !ok {
		return defaultVal
	} else {
		if to, err := values.ToTimeDurationE(v); err != nil {
			return defaultVal
		} else {
			return to
		}
	}
}

// GetTimeDurationE 读取并转换目标为time.Duration, 转换失败则返回零值和错误信息
func GetTimeDurationE(key string) (time.Duration, error) {
	if v, ok := GetExist(key); !ok {
		return 0, ErrKeyNotExist
	} else {
		return values.ToTimeDurationE(v)
	}
}

// GetTimeMonth 读取并转换目标为time.Month, 转换失败则返回零值的Month
func GetTimeMonth(key string) time.Month {
	return GetTimeMonthD(key, time.Month(0))
}

// GetTimeMonthD 读取并转换目标为time.Month, 转换失败则返回defaultVal指定的Month对象
func GetTimeMonthD(key string, defaultVal time.Month) time.Month {
	if v, ok := GetExist(key); !ok {
		return defaultVal
	} else {
		if to, err := values.ToTimeMonthE(v); err != nil {
			return defaultVal
		} else {
			return to
		}
	}
}

// GetTimeMonthE 读取并转换目标为time.Month, 转换失败则返回零值的Month和错误信息
func GetTimeMonthE(key string) (time.Month, error) {
	if v, ok := GetExist(key); !ok {
		return time.Month(0), ErrKeyNotExist
	} else {
		return values.ToTimeMonthE(v)
	}
}

// GetTimeWeekday 读取并转换目标为time.Weekday, 转换失败则返回零值的Weekday
func GetTimeWeekday(key string) time.Weekday {
	return GetTimeWeekdayD(key, time.Weekday(0))
}

// GetTimeWeekdayD 读取并转换目标为time.Weekday, 转换失败则返回defaultVal指定的Weekday对象
func GetTimeWeekdayD(key string, defaultVal time.Weekday) time.Weekday {
	if v, ok := GetExist(key); !ok {
		return defaultVal
	} else {
		if to, err := values.ToTimeWeekdayE(v); err != nil {
			return defaultVal
		} else {
			return to
		}
	}
}

// GetTimeWeekdayE 读取并转换目标为time.Weekday, 转换失败则返回零值的Weekday和错误信息
func GetTimeWeekdayE(key string) (toVal time.Weekday, err error) {
	if v, ok := GetExist(key); !ok {
		return toVal, ErrKeyNotExist
	} else {
		return values.ToTimeWeekdayE(v)
	}
}
